package queueFactory

import (
	"base/common/funs"
	"base/common/log"
	"base/common/queue/queueAbstruct"
	redis2 "base/common/redis"
	"context"
	"github.com/redis/go-redis/v9"
	"time"
)

// 定义 redis 结构体
type RedisQueue struct {
	R        *redis.Client
	Data     *queueAbstruct.QueueObj
	JsonData string
	QueCh    chan string
}

// 实例化对象
func (r *RedisQueue) New(obj *queueAbstruct.QueueObj) *RedisQueue {

	//队列参数赋值
	r.Data = obj

	// 实例化 redis 连接
	r.R = redis2.RDB

	return r
}

// 将结构体转为Json
func (r *RedisQueue) MakeJson() *RedisQueue {

	//获取格式化后得 json 字符串
	jsonSrt, err := funs.GetJsonData(r.Data)

	if err != nil {
		log.ELog("rabbitMq读取失败", map[string]any{
			"err": err.Error(),
		})
		panic("转换json 字符串失败")
	}

	r.JsonData = jsonSrt

	//获取队列名称
	r.Data.Name = queueAbstruct.GetQueueName(r.Data.Name)

	return r
}

// 压入队列 并返回结果
func (r *RedisQueue) Push() error {
	cmd := r.R.LPush(context.Background(), r.Data.Name, r.JsonData)
	//defer r.R.Close()
	return cmd.Err()
}

// 读取数据
func (r *RedisQueue) ReadList(ch *chan string) {

	go func() {
		for {
			str, err := r.R.LPop(context.Background(), queueAbstruct.GetQueueName(r.Data.Name)).Result()

			//如果队列不存在 则休眠 休眠之后跳出当前次循环 再次执行
			if err == redis.Nil {
				time.Sleep(queueAbstruct.SleepTime)
				continue
			}

			// 读取队列错误
			if err != nil {
				log.ELog("读取队列错误", map[string]any{
					"Key": r.Data.Name,
					"err": err.Error(),
				})
				continue
			}

			//压出消费者管道
			*ch <- str
			//任务执行间隔
			time.Sleep(queueAbstruct.NextTime)
		}
	}()

}
